package com.jeff.android.lab.architecture.designpattern.singleton;

/**
 * 双重检查模式
 *
 * 1、延迟初始化。和懒汉模式一致，只有在初次调用静态方法getSingleton，才会初始化signleton实例。
 * 2、性能优化。同步会造成性能下降，在同步前通过判读singleton是否初始化，减少不必要的同步开销。
 * 3、线程安全。同步创建Singleton对象，同时注意到静态变量singleton使用volatile修饰。
 *
 * @author: dingfeng
 * @date: 2020-08-05
 * @since: 1.0.0
 **/
public class DoubleCheckSingleton {

    private static volatile DoubleCheckSingleton singleton; // 用 volatile 修饰，防止重排序

    private DoubleCheckSingleton() {
    }

    public static DoubleCheckSingleton getSingleton() {
        if (null == singleton) {
            synchronized (DoubleCheckSingleton.class) {
                if (null == singleton)
                    singleton = new DoubleCheckSingleton();
            }
        }
        return singleton;
    }

}
